package com.gome.boot.common.util;

import com.gome.boot.common.enums.DateStyleEnum;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期时间工具类.
 *
 * @author baoxiufeng
 */
public class DateUtils {
    private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>();
    private static final Object object = new Object();

    private DateUtils() {
    }

    /**
     * 获取当前时间.
     *
     * @return 当前时间对象
     */
    public static Date getCurrentDate() {
        return Calendar.getInstance().getTime();
    }

    /**
     * 获取当前格式化用的日期格式化对象.
     *
     * @param pattern 待设置的日期格式化模式
     * @return 日期格式化对象
     */
    private static SimpleDateFormat getDateFormat(String pattern) {
        SimpleDateFormat dateFormat = (SimpleDateFormat) threadLocal.get();
        if (dateFormat == null) {
            synchronized (object) {
                if (dateFormat == null) {
                    dateFormat = new SimpleDateFormat(pattern);
                    dateFormat.setLenient(false);
                    threadLocal.set(dateFormat);
                }
            }
        }
        dateFormat.applyPattern(pattern);
        return dateFormat;
    }

    /**
     * 根据指定日期格式格式化日期为字符串.
     *
     * @param date 待格式化的日期对象
     * @param pattern 格式化用的日期格式
     * @return 格式化后的日期字符串
     */
    public static String dateToString(Date date, String pattern) {
        if (date != null) {
            try {
                return getDateFormat(pattern).format(date);
            } catch (Exception e) {
                ;
            }
        }
        return null;
    }

    /**
     * 根据指定日期格式格式化日期为字符串.
     *
     * @param date 待格式化的日期对象
     * @param dateStyle 格式化用的日期格式枚举
     * @return 格式化后的日期字符串
     */
    public static String dateToString(Date date, DateStyleEnum dateStyle) {
        return dateToString(date, dateStyle.getValue());
    }

    /**
     * 根据指定日期格式格式化字符串为日期对象.
     *
     * @param str 待格式化的日期字符串
     * @param pattern 格式化用的日期格式
     * @return 格式化后的日期对象
     */
    public static Date stringToDate(String str, String pattern) {
        if (CommonUtils.isNotEmpty(str)) {
            try {
                return getDateFormat(pattern).parse(str);
            } catch (ParseException e) {
                ;
            }
        }
        return null;
    }

    /**
     * 根据指定日期格式格式化字符串为日期对象.
     *
     * @param str 待格式化的日期字符串
     * @param dateStyle 格式化用的日期格式枚举
     * @return 格式化后的日期对象
     */
    public static Date stringToDate(String str, DateStyleEnum dateStyle) {
        return stringToDate(str, dateStyle.getValue());
    }

    /**
     * 获取与当前相隔指定类型的间隔单位数的时间.
     *
     * @param type 间隔单位类型（年、月、日）
     * @param interval 间隔单位数
     * @return 间隔单位后的时间
     */
    public static Date getBeforeOrAfterNowByThisInterval(int type, int interval) {
        Calendar c = Calendar.getInstance();
        switch (type) {
            case Calendar.YEAR:
            case Calendar.MONTH:
            case Calendar.DAY_OF_MONTH:
                c.add(type, interval);
                break;
        }
        return c.getTime();
    }

    /**
     * 获取与指定日期时间相隔指定类型的间隔单位数的时间.
     *
     * @param date 指定日期时间对象
     * @param type 间隔单位类型（年、月、日）
     * @param interval 间隔单位数
     * @return 间隔单位后的时间
     */
    public static Date getBeforeOrAfterNowByThisInterval(Date date, int type, int interval) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        switch (type) {
            case Calendar.YEAR:
            case Calendar.MONTH:
            case Calendar.DAY_OF_MONTH:
                c.add(type, interval);
                break;
        }
        return c.getTime();
    }
}
